﻿//#define _CRT_SECURE_NO_WARNINGS
//#include <stdio.h>
////#include <string.h>
//#include <assert.h> // 引入断言头文件

#include "common.h"

char* my_strcpy(char* dest, const char* src)
{ // 自定义函数模仿 strcpy 函数
	// const char* src 代表指针 src 指向的对象是只读的（常变量），不能修改
	assert(src != NULL); // 断言，检查参数是否为空指针
	assert(dest != NULL); // 断言，检查参数是否为空指针
	char* start = dest; // 目标字符串指针，指向要拷贝的字符串的第一个字符
	/*int i; // 满分 10 分，这里 3分
	for (i = 0; src[i] != '\0'; ++i)
		dest[i] = src[i];
	if (src[i] == '\0')
		dest[i] = '\0'; // strcpy 函数会连 '\0' 也拷贝到目标字符串中*/
	while (*dest++ = *src++);  // 改进版，'\0' == 0
	// 这里注意一个小问题：循环结束后，
	// dest 指针指向的位置是后面的空字符后一个位置，
	// 因为 *dest == '\0'后，while 循环不会再执行，
	// 但是 dest++ 仍然会执行
	// 注意 dest 指针也是对传入的指针地址的临时拷贝
	dest = start; // 修正 dest 指针指向的位置
	return dest;
	/* 正确的做法应该是返回 start 指针，而上面一行 dest = start; 不用写，
		这里只是为了理解指针的偏移 */
}

int my_strlen(const char* str)
{
	assert(str != NULL); // 断言，检查参数是否为空指针
	char* start = str;
	while (*str++); // '\0' == 0
	return str - start - 1; // 减 1 是因为最后一个字符是 '\0'，不算
}
